/*
 * Copyright 2017 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */
#ifndef SkPDFGradientShader_DEFINED
#define SkPDFGradientShader_DEFINED

#include "include/core/SkShader.h"
#include "src/pdf/SkPDFTypes.h"
#include "src/pdf/SkPDFUtils.h"
#include "src/shaders/SkShaderBase.h"

class SkMatrix;
class SkPDFDocument;
struct SkIRect;

namespace SkPDFGradientShader {
SkPDFIndirectReference Make(SkPDFDocument *doc, SkShader *shader, const SkMatrix &matrix, const SkIRect &surfaceBBox);

struct Key {
    SkShaderBase::GradientType fType;
    SkShaderBase::GradientInfo fInfo;
    std::unique_ptr<SkColor[]> fColors;
    std::unique_ptr<SkScalar[]> fStops;
    SkMatrix fCanvasTransform;
    SkMatrix fShaderTransform;
    SkIRect fBBox;
    uint32_t fHash;
};

struct KeyHash {
    uint32_t operator () (const Key &k) const
    {
        return k.fHash;
    }
};

inline bool operator == (const SkShaderBase::GradientInfo &u, const SkShaderBase::GradientInfo &v)
{
    return u.fColorCount == v.fColorCount && u.fPoint[0] == v.fPoint[0] && u.fPoint[1] == v.fPoint[1] &&
        u.fRadius[0] == v.fRadius[0] && u.fRadius[1] == v.fRadius[1] && u.fTileMode == v.fTileMode &&
        u.fGradientFlags == v.fGradientFlags && SkPackedArrayEqual(u.fColors, v.fColors, u.fColorCount) &&
        SkPackedArrayEqual(u.fColorOffsets, v.fColorOffsets, u.fColorCount);
}

inline bool operator == (const Key &u, const Key &v)
{
    SkASSERT(u.fInfo.fColors == u.fColors.get());
    SkASSERT(u.fInfo.fColorOffsets == u.fStops.get());
    SkASSERT(v.fInfo.fColors == v.fColors.get());
    SkASSERT(v.fInfo.fColorOffsets == v.fStops.get());
    return u.fType == v.fType && u.fInfo == v.fInfo && u.fCanvasTransform == v.fCanvasTransform &&
        u.fShaderTransform == v.fShaderTransform && u.fBBox == v.fBBox;
}
inline bool operator != (const Key &u, const Key &v)
{
    return !(u == v);
}
} // namespace SkPDFGradientShader
#endif // SkPDFGradientShader_DEFINED
